#include <cstdio>
#include <string>
#include <unistd.h>
#include <pthread.h>
#include "Mutex.hpp"

//实现加锁和没加锁的抢票功能

int ticket=10;//票数

//1.未加锁版
// void* route(void* args)
// {
//     std::string name = static_cast<const char*>(args);
//     while(true)
//     {
//         if(ticket>0)
//         {
//             usleep(10000);
//             printf("%s 抢占票号: %d\n",name.c_str(),ticket--);
//         }
//         else
//         {
//             break;
//         }
//     }
//     return (void*)0;
// }
// int main()
// {
//     pthread_t tid;
//     //创建线程
//     pthread_create(&tid,nullptr,route,(void*)"thread-1");
//     //回收线程
//     pthread_join(tid,nullptr);
//     return 0;
// }
/////////////////////////////////////////////////////////////////////

//2.加锁版

struct data
{
    std::string name;
    pthread_mutex_t* lockp;
};

void* route(void* args)
{
    data *d = static_cast<data*>(args);
    while(true)
    {
        pthread_mutex_lock(d->lockp);
        if(ticket>0)
        {
            usleep(10000);
            printf("%s 抢占票号: %d\n", d->name.c_str(), ticket--);
        }
        else{
            
            pthread_mutex_unlock(d->lockp);
            break;
        }
    }
    return (void*)0;
}

int main()
{
    //创建锁并初始化
    pthread_mutex_t lock;
    pthread_mutex_init(&lock,nullptr);

    pthread_t t1,t2,t3,t4;

    //传递结构体数据
    data d1 ={"thread-1",&lock};
    pthread_create(&t1,nullptr,route,(void*)&d1);

    data d2 ={"thread-2",&lock};
    pthread_create(&t2,nullptr,route,(void*)&d2);

    data d3 ={"thread-3",&lock};
    pthread_create(&t3,nullptr,route,(void*)&d3);

    data d4 ={"thread-4",&lock};
    pthread_create(&t4,nullptr,route,(void*)&d4);

    //回收
    pthread_join(t1,nullptr);
    pthread_join(t2,nullptr);
    pthread_join(t3,nullptr);
    pthread_join(t4,nullptr);

    //销毁锁
    pthread_mutex_destroy(&lock);
    return 0;
}
